package main

import (
	"embed"
	"fmt"
	"io/fs"
	"log"
	"net/http"
	"os"

	"android-retrace/internal/config"
	"android-retrace/internal/handlers"
	"android-retrace/internal/websocket"

	"github.com/gin-gonic/gin"
)

//go:embed web/dist/*
var assetFS embed.FS

func main() {
	err := config.LoadConfig("conf/config.yaml")
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	port := config.Cfg.Server.Port
	fmt.Printf("服务启动，监听端口: %d\n", port)

	f, err := os.OpenFile("log/server.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o644)
	if err != nil {
		log.Fatal(err)
	}
	log.SetOutput(f)

	// 清空 temp 目录
	tempDir := "temp"
	if err := os.RemoveAll(tempDir); err != nil {
		log.Printf("清空temp目录失败: %v", err)
	}
	if err := os.MkdirAll(tempDir, 0o755); err != nil {
		log.Fatalf("创建temp目录失败: %v", err)
	}

	// 创建Gin引擎
	r := gin.Default()

	// 设置静态文件服务
	// r.Static("/static", "./web/dist")
	// r.StaticFile("/", "./web/dist/index.html")

	fp, err := fs.Sub(assetFS, "web/dist")
	if err != nil {
		panic(err.Error())
	}
	r.StaticFS("/static/", http.FS(fp))

	// 根路由返回 embed 的 index.html
	r.GET("/", func(c *gin.Context) {
		data, err := assetFS.ReadFile("web/dist/index.html")
		if err != nil {
			c.String(404, "index.html not found")
			return
		}
		c.Data(200, "text/html; charset=utf-8", data)
	})

	// 创建WebSocket管理器
	mgr := websocket.NewManager()
	go mgr.Run() // 一定要加这行，启动管理协程

	// 创建处理器
	handler := handlers.NewHandler(mgr)

	// 设置路由
	r.GET("/ws", func(c *gin.Context) {
		mgr.HandleWebSocket(c)
	})
	r.POST("/upload", handler.UploadFile)
	r.POST("/parse", handler.ParseLog)

	// 启动服务器
	log.Println("服务器启动在 :", port)
	if err := r.Run(fmt.Sprintf(":%d", port)); err != nil {
		log.Fatal("服务器启动失败:", err)
	}
}
